class SceneLevel extends eui.Component implements  eui.UIComponent {

	// 滚动视图
	public level_group:eui.Scroller;
	// 可以滚动的关卡容器
	public group_levels:eui.Group;
	// 关卡指示箭头
	public img_arrow:eui.Image;
	// 返回按钮
	public btn_back:eui.Button;

	// 选中的关卡（指示箭头指向的关卡）
	private sel_level: number = 0;

	// 声明一个数组，存放关卡按钮
	private levelIcon: LevelIcon[] = []; 

	
	// 声明单例
	private static shared: SceneLevel;
	public static Shared(): SceneLevel {
		if(SceneLevel.shared == null) {
			SceneLevel.shared = new SceneLevel();
		}
		return SceneLevel.shared;
	}

	public constructor() {
		super();
	}

	protected partAdded(partName:string,instance:any):void
	{
		super.partAdded(partName,instance);
	}


	protected childrenCreated():void
	{
		super.childrenCreated();
		this.init();
	}

	// 初始化函数
	private init() {
		// 禁用滚动视图的横向滚动
		this.level_group.scrollPolicyH = eui.ScrollPolicy.OFF;
		// 给返回按钮设置绑定事件
		this.btn_back.addEventListener(
			egret.TouchEvent.TOUCH_TAP,
			this.back_tap,
			this
		);

		// 把舞台y轴分为20份，x轴分为10份
		var row = 10;
		var col = 20;
		// 水平一份的大小
		var spanX = this.width / row;
		// 垂直一份的大小（关卡按钮的高度）
		var spanY = this.height / col;

		// 定义一个容器
		var group = new eui.Group();
		this.group_levels.addChild(group);
		group.width = this.width;
		// 滚动容器的高度 = 关卡按钮的高度 * 关卡的个数
		group.height = spanY * LevelDataManager.Shared().getLevelsNum();

		// 填充滚动容器的背景
		for(var i: number = 0; i < group.height / this.height; i++) {
			var img = new eui.Image();
			// 填充img背景
			img.source = RES.getRes('GameBG2_jpg');
			// 设置img的高度，让前后两个img上下相连
			img.y = i*this.height;
			// 禁用背景图
			img.touchEnabled = false;
			// 添加滚动视图的显示列表
			this.group_levels.addChildAt(img,0);
		}

		// 获取游戏存档的最远的关卡
		// 当玩到当前关卡或者玩过的关卡设置为可玩的状态，未玩的关卡设置为禁用的状态
		var mileStone: number = LevelDataManager.Shared().MileStone;

		// 动态生成关卡按钮
		for(var i: number = 0; i < LevelDataManager.Shared().getLevelsNum(); i++) {
			// 定义一个关卡按钮
			var icon = new LevelIcon();
			// 添加到group里面去
			group.addChild(icon);
			// 设置关卡显示文本
			icon.Level = i + 1;

			// 设置x轴的位置
			icon.x = Math.sin(spanY*i/2/180*Math.PI)*200 + group.width/2;
			// 设置y轴的位置
			icon.y = group.height - spanY * i - icon.height;

			// 给每个关卡按钮绑定点击方法
			icon.addEventListener(
				egret.TouchEvent.TOUCH_TAP,
				this.icon_tap,
				this
			);

			// 根据存档来设置关卡按钮的状态
			icon.enabled = i < mileStone;

			// 把关卡按钮存放起来
			this.levelIcon.push(icon);
		}

		// 滚动视图默认出现在最底部
		this.group_levels.scrollV = group.height - this.height;

		// 拿到最远关卡，超过 20 关就是超过一个屏幕的高度
		if(mileStone > 20) {
			this.group_levels.scrollV = group.height - mileStone*spanY - this.img_arrow.height;
		}

		// 指示箭头的位置
		// 修改箭头的锚点位置为底部的尖端点
		this.img_arrow.anchorOffsetX = this.img_arrow.width/2;
		this.img_arrow.anchorOffsetY = this.img_arrow.height;
		this.img_arrow.touchEnabled = false;

		// 游戏初始化的时候，箭头出现在最远关卡的正上方
		// 声明最远关卡
		var currentIcon = group.getChildAt(mileStone - 1);
		this.img_arrow.x = currentIcon.x + currentIcon.width;
		this.img_arrow.y = currentIcon.y;
		// 设置当选中的关卡
		this.sel_level = mileStone;
		// 让箭头显示到最顶层
		this.group_levels.addChild(this.img_arrow);


	}

	/**
	 * 点击返回按钮的响应函数
	 */
	private back_tap() {
		// 点击返回按钮音效
		SoundManager.Shared().playClick();

		this.parent.addChild(GameBegin.Shared());
		this.parent.removeChild(this);
	}

	/**
	 * 点击关卡按钮的响应事件
	 */
	private icon_tap(e: egret.TouchEvent) {
		// 点击关卡按钮音效
		SoundManager.Shared().playClick();  

		// 获取被点击的关卡的按钮
		var icon = <LevelIcon>e.currentTarget;
		if(this.sel_level != icon.Level) {
			// 如果指示箭头指向的关卡不是我们点击的关卡，则移动指示箭头到点击关卡处
			this.img_arrow.x = icon.x + icon.width/2;
			this.img_arrow.y = icon.y;
			// 记录指示箭头的指向的关卡
			this.sel_level = icon.Level;
		}else{
			// 点击的关卡就是箭头指向的关卡，则直接进入游戏场景并开始游戏
			this.parent.addChild(SceneGame.Shared());
			this.parent.removeChild(this);
			// 传入点击的关卡所在关卡数组的下标
			SceneGame.Shared().initLevel(icon.Level - 1);
		}
	}

	/**
	 * 记录玩家过关的最远关卡，并且调整箭头指示的位置
	 */
	public SetMileStoneLevel(level: number) {
		// 拿到过关的关卡按钮
		var icon = this.levelIcon[level - 1];
		// 设置该关卡为激活状态
		icon.enabled = true;
		// 设置指示箭头到该关卡上
		this.img_arrow.x = icon.x + icon.width/2;
		this.img_arrow.y = icon.y;

		// 记录最远关卡
		if(level > LevelDataManager.Shared().MileStone) {
			LevelDataManager.Shared().MileStone = level;
		}
	}
	
}